#!/bin/bash

# Trying to stop server
PRLCTLPATH='/usr//bin/prlctl'
PVAMN_ID_FILE='/Applications/Parallels/Install Parallels Virtual Automation.app/Contents/Resources/pvamn_id'
EXTRA_COMP=

if [ "x$(echo ${PWD:0:1})" == "x/" ]; then
    BaseDir="$(dirname "${0}")"
else
    BaseDir="$(pwd)/$(dirname "${0}")"
fi

uninstaller_messages_strings=$("$BaseDir/localize_shell.sh" "$BaseDir/@LPROJ_LOCALE.lproj/uninstaller_messages.strings")
[ $? -eq 0 ] && . "$uninstaller_messages_strings"

RECEIPT_DIR="/Library/Parallels/Parallels Service.app/Contents/Receipts"
COMMON_RECEIPT_DIR="/Library/Parallels/Receipts"
LIB_RECEIPT="/Library/Receipts"
RECEIPT_DB_DIR="/var/db/receipts"
PRODUCT="Parallels Desktop for Mac"

CheckProcessRunning()
{
	! ps -w -w -A -ocommand 2>/dev/null | grep -nq "${1}"
}

CheckRunningAppsVirtualization ()
{
	if ! CheckProcessRunning "Parallels\ Management\ Console.app/Contents/MacOS/prl_client_app"; then
		PRODUCT="Parallels Management Console"
		eval "echo \"$check_msg_running_prod\"" >&2
		exit 117
	fi

	if ! CheckProcessRunning "Parallels\ Server\ Transporter.app/Contents/MacOS/Parallels\ Server\ Transporter"; then
		PRODUCT="Parallels Server Transporter"
		eval "echo \"$check_msg_running_prod\"" >&2
		exit 119
	fi
	
	if ! CheckProcessRunning "Parallels\ Server\ Explorer.app/Contents/MacOS/Parallels\ Server\ Explorer"; then
		PRODUCT="Parallels Explorer and Parallels Server Mounter"
		eval "echo \"$check_msg_running_mult\"" >&2
		exit 120
	fi

	if ! CheckProcessRunning "Parallels\ Desktop.app/Contents/MacOS/prl_client_app"; then
		PRODUCT="Parallels Desktop"
		eval "echo \"$check_msg_running_prod\"" >&2
		exit 117
	fi

	if ! CheckProcessRunning "Parallels\ Transporter.app/Contents/MacOS/Parallels\ Transporter"; then
		PRODUCT="Parallels Transporter"
		eval "echo \"$check_msg_running_prod\"" >&2
		exit 119
	fi
	
	if ! CheckProcessRunning "Parallels\ Explorer.app/Contents/MacOS/Parallels\ Explorer"; then
		PRODUCT="Parallels Explorer and Parallels Mounter"
		eval "echo \"$check_msg_running_mult\"" >&2
		exit 120
	fi
	
	if ! CheckProcessRunning "Parallels\ Mounter.app/Contents/MacOS/Parallels\ Mounter"; then
		PRODUCT="Parallels Explorer and Parallels Mounter"
		eval "echo \"$check_msg_running_mult\"" >&2
		exit 120
	fi

	
	if ! CheckProcessRunning "Parallels\ VM.app/Contents/MacOS/prl_vm_app"; then
		echo "${check_msg_running_vm}" >&2
		exit 121
	fi
	
	exit 0
}

CheckRunningAppsPMC ()
{
	if ! CheckProcessRunning "Parallels\ Management\ Console\ .app/Contents/MacOS/prl_client_app"; then
		PRODUCT="Parallels Management Console"
		eval "echo $check_msg_running_prod" >&2
		exit 117
	fi

	exit 0
}

CheckInstalled()
{
	[ -d "/Library/Receipts/$1" -o -f "/var/db/receipts/$2" -o -d "${RECEIPT_DIR}/$1" -o -d "${COMMON_RECEIPT_DIR}/$1" ]
}

CheckPMCInstalled ()
{
	CheckInstalled "Parallels Management Console Standalone.pkg" "com.parallels.pkg.pmc.bom" && return 0
	exit 111 
}

CheckVirtualizationInstalled ()
{
	uninstaller_dir="/Library/Parallels/Uninstaller/Parallels Hypervisor"
	[[ -f "$uninstaller_dir/Uninstaller.sh" && -f "$uninstaller_dir/manifest" ]] && return 0
	
	return 111
}

CheckSDKInstalled ()
{
	CheckInstalled "Parallels Virtualization SDK.pkg" "com.parallels.pkg.sdk.bom" && return 0
	exit 111
}

CheckGToolsInstalled ()
{

    audio_plist="/var/db/receipts/com.parallels.pkg.guestostools_mac.audio.plist"
    video_plist="/var/db/receipts/com.parallels.pkg.guestostools_mac.video.plist"
    ts_plist="/var/db/receipts/com.parallels.pkg.guestostools_mac.ts.plist"
    hosttime_plist="/var/db/receipts/com.parallels.pkg.guestostools_mac.hosttime.plist"
	if [ -d "/Library/Receipts/Parallels Tools Audio.pkg" -o -d "${RECEIPT_DIR}/Parallels Tools Audio.pkg" -o -f "$audio_plist" ]; then
		return 0
	fi
	if [ -d "/Library/Receipts/Parallels Tools Video.pkg" -o -d "${RECEIPT_DIR}/Parallels Tools Video.pkg" -o -f "$video_plist" ]; then
		return 0
	fi
	if [ -d "/Library/Receipts/Parallels Tools TimeSync.pkg" -o -d "${RECEIPT_DIR}/Parallels Tools TimeSync.pkg" -o -f "$ts_plist" ]; then
		return 0
	fi
	if [ -d "/Library/Receipts/Parallels Tools HostTime.pkg" -o -d "${RECEIPT_DIR}/Parallels Tools HostTime.pkg" -o -f "$hosttime_plist" ]; then
		return 0
	fi
	exit 111
}

CheckOldDesktopInstalled ()
{
	versions="4 5"
	names="Parallels Desktop:Parallels Explorer:Parallels Transporter"
	
	for ver in ${versions}; do
		for dir in "${RECEIPT_DIR}" "${LIB_RECEIPT}" "${COMMON_RECEIPT_DIR}"; do
			IFS=$':'
			for name in ${names}; do
				[ -d "${dir}/${name}.pkg" ] && return 0
				[ -d "${dir}/${name} ${ver}.pkg" ] && return 0
			done
			unset IFS
		done
	done
	
	products=".explorer. .transporter. ."
	for product in ${products}; do
		[ -f "/var/db/receipts/com.parallels.desktop${product}bom" ] && return 0
	done
	
	return 111
}

CheckOldServerInstalled ()
{
	versions="3 4"
	server='Parallels Server'
	names="Parallels Management Console:$server Explorer:$server Transporter:$server"
	
	for ver in ${versions}; do
		for dir in "${RECEIPT_DIR}" "${LIB_RECEIPT}" "${COMMON_RECEIPT_DIR}"; do
			IFS=$':'
			for name in ${names}; do
				[ -d "${dir}/${name}.pkg" ] && return 0
				[ -d "${dir}/${name} ${ver}.pkg" ] && return 0
			done
			unset IFS
		done
	done
	
	products=".explorer. .transporter. ."
	for product in ${products}; do
		[ -f "/var/db/receipts/com.parallels.server${product}bom" ] && return 0
	done
	
	return 111
}

CheckPVAAgentInstalled ()
{
	pva_names="pva-agent-core:pva-agent-pl:pva-pp-core:pva-pp-docs:pva-pp-engine:pva-pp-i18n:pva-pp-parallels-pva-pp-plesk-pva-pp-virtuozzo"
	IFS=$':'
	for name in ${pva_names}; do
		if [ -d "${LIB_RECEIPT}/${name}.pkg" -o -f "${RECEIPT_DB_DIR}/com.parallels.${name}.bom" ]; then
			return 0 
		fi
	done
	unset IFS
	return 1
}

CheckPVAMNInstalled ()
{
	if [ -f "$PVAMN_ID_FILE" ]; then
		"${PRLCTLPATH}" list $(cat "$PVAMN_ID_FILE") >/dev/null 2>&1 && return 0
	fi
	return 1
}

CheckPVAInstalled ()
{
	CheckPVAAgentInstalled && EXTRA_COMP="$EXTRA_COMP pvaagent"
	CheckPVAMNInstalled && EXTRA_COMP="$EXTRA_COMP pvamn"
	echo "$EXTRA_COMP"
}

while true; do
	case "${1}" in
		virtualization|server|desktop|stm)
			target='virtualization'
			shift
			;;
		gtools)
			target='gtools'
			shift
			;;
		sdk)
			target='sdk'
			shift
			;;	
		pmc)
			target='pmc'
			shift
			;;	

		-*)
			echo "Unknown option: '$1'" 1>&2
			PrintHelp
			break
			;;
		*)
			break
			;;
	esac
done

if [ "${target}" = "virtualization" ]; then
	CheckPVAInstalled
	CheckVirtualizationInstalled
	ret=$?
	CheckOldDesktopInstalled
	ret=$(expr $? + $ret)
	CheckOldServerInstalled
	ret=$(expr $? + $ret)
	# If nothing installed
	[ $ret -eq 333 ] && exit 111
	
	CheckRunningAppsVirtualization
fi

if [ "${target}" = "gtools" ]; then
	CheckGToolsInstalled
fi

if [ "${target}" = "sdk" ]; then
	CheckSDKInstalled
fi

if [ "${target}" = "pmc" ]; then
	CheckPMCInstalled
	CheckRunningAppsPMC
fi
